Skip to content

Build hatter as cached cabal package for iOS/watchOS#214

Closed
jappeace-sloth wants to merge 1 commit intojappeace:masterfrom
jappeace-sloth:ios-cached-hatter-package
Closed

Build hatter as cached cabal package for iOS/watchOS#214
jappeace-sloth wants to merge 1 commit intojappeace:masterfrom
jappeace-sloth:ios-cached-hatter-package

Conversation

@jappeace-sloth
Copy link
Copy Markdown

Summary

  • Mirror the Android cross-deps.nix approach for iOS/watchOS: build hatter via callCabal2nix in ios-deps.nix so the .a and package DB entry are cached
  • Demo apps and consumers only recompile Main.hs + run_main.c instead of all 22 Hatter modules + 19 C sources from scratch every time
  • Standalone fallback (crossDeps == null) preserves current from-source behavior for callers that don't use ios-deps.nix

Test plan

  • Verify nix-instantiate --parse passes on all modified files (done locally)
  • CI builds iOS and watchOS static libraries successfully
  • Simulator apps still launch and render correctly

🤖 Generated with Claude Code

Mirror the Android approach from cross-deps.nix: build hatter via
callCabal2nix in ios-deps.nix so the .a and package DB entry are
cached. Demo apps and consumers only recompile Main.hs + run_main.c
(the per-app entry point) instead of all 22 Hatter modules + 19 C
sources from scratch every time.

Changes:
- ios-deps.nix: add hatterSrc param, hatterOverride (strips exe/test
  stanzas), compose into overrides, collect hatter .a in deps
- ios.nix, watchos.nix: pass hatterSrc = ../. to ios-deps.nix
- lib.nix: when crossDeps is provided, mkIOSLib and mkWatchOSLib skip
  copying Hatter/*.hs and cbits/*.c, only compile run_main.c + Main.hs
  with -package-db pointing at the cached pkgdb. Standalone fallback
  (crossDeps == null) keeps current from-source behavior.

Prompt: Implement the plan to build hatter as a cached package for iOS/watchOS (like Android)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jappeace-sloth
Copy link
Copy Markdown
Author

Superseded by #215 (combined with #213)

jappeace pushed a commit that referenced this pull request Apr 26, 2026
Combines two improvements to the Nix build infrastructure:

1. Deduplicate nix/lib.nix (995 → ~700 lines, 30% reduction):
   - Extract shared data lists (modules, C sources, headers, symbols)
     and helper functions into top-level let bindings
   - Merge mkIOSLib + mkWatchOSLib into internal mkAppleStaticLib
     parameterised by platform; public API preserved via thin wrappers
   - Merge mkSimulatorApp + mkWatchOSSimulatorApp into internal
     mkAppleSimulatorApp; public API preserved
   - Replace 14 repetitive NDK compile blocks with map over list
   - Hoist applePkgs, appleGhc, gmpStatic, libffiStatic to top-level

2. Build hatter as a cached cabal package for iOS/watchOS:
   - ios-deps.nix: add hatterSrc param, build hatter via callCabal2nix
     so the .a and package DB entry are cached
   - ios.nix, watchos.nix: pass hatterSrc to ios-deps.nix
   - mkAppleStaticLib: when crossDeps is provided, only compile
     Main.hs + run_main.c instead of all 22 modules + 19 C sources
   - Standalone fallback (crossDeps == null) preserved

Adding a new bridge module now means editing 1 list, not 6+ places.
Demo apps and consumers only recompile their entry point.

Prompt: combine PR #213 and #214 into a single PR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant